#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Dec 30 20:02:22 2017 @author: Kamessi """ import csv import numpy as np from scipy import linalg as LA def read_country(filename): f = open(filename,'r', encoding='utf-8') reader = csv.reader(f) raw_matrix = [] for row in reader: temp = [] for i in range(0,len(row)): try: temp.append(float(row[i])) except ValueError: temp.append(row[i]) raw_matrix.append(temp) f.close() return raw_matrix def rank(score_dict): rank_list = [] score_list = [] for item in score_dict: score_list.append(score_dict[item]) while score_list: maximum = max(score_list) for item in score_dict: if score_dict[item] == maximum: rank_list.append(item) score_list = [score for score in score_list if score!= maximum] return rank_list def main(): #Read the raw matrix raw_matrix = read_country("2009.csv") #compute mcp product_list = raw_matrix[0][1::] country_list = [] for i in range(1,len(raw_matrix)): country_list.append(raw_matrix[i][0]) country_sum = [] for i in range(1,len(raw_matrix)): country_sum.append(np.sum(raw_matrix[i][1::])) product_sum = [] for i in range(1,len(raw_matrix[0])): product = 0 for j in range(1,len(raw_matrix)): product += raw_matrix[j][i] product_sum.append(product) total_sum = np.sum(product_sum) mcp = [] for i in range (1,len(raw_matrix)): country_row = [] for j in range(1,len(raw_matrix[i])): percentage = raw_matrix[i][j]/country_sum[i-1] total_percentage = product_sum[j-1]/total_sum if percentage > total_percentage: country_row.append(1) else: country_row.append(0) mcp.append(country_row) #compute mpp country_sum2 = [] for i in range(0,len(mcp)): country_sum2.append(np.sum(mcp[i])) product_sum2 = [] for i in range(0,len(mcp[0])): product = 0 for j in range(0,len(mcp)): product += mcp[j][i] product_sum2.append(product) mpp = [] for i in range(0,len(mcp[0])): product_row = [] for j in range(0,len(mcp[0])): temp_sum = 0 for k in range(0,len(mcp)): try: temp_sum += (mcp[k][i] * mcp[k][j]/(country_sum2[k]*product_sum2[i])) except: pass product_row.append(temp_sum) mpp.append(product_row) #compute PCI mpp = np.array(mpp) e_vals, e_vecs = LA.eig(mpp) eigenvectors = e_vecs.tolist() eigen = [] for eigenvector in eigenvectors: temp = [] for col in eigenvector: temp.append(col.real) eigen.append(temp) vector = [] for i in range(0,len(eigen)): vector.append(eigen[i][1]) pci = [] if vector[len(vector)-2] > 0: for item in vector: pci.append((item-np.mean(vector))/np.std(vector)) else: for item in vector: pci.append((-item+np.mean(vector))/np.std(vector)) #compute proximity proximity = [] for i in range(0,len(mcp[0])): product_row = [] for j in range(0,len(mcp[0])): temp_sum = 0 for k in range(0,len(mcp)): try: temp_sum += mcp[k][i] * mcp[k][j] except: pass p0 = product_sum2[i] p1 = product_sum2[j] if p0 < p1: large = p1 else: large = p0 product_row.append(temp_sum/large) proximity.append(product_row) #compute actual distance distance = [] for i in range(0,len(mcp)): product_row = [] for j in range(0,len(mcp[0])): sum1 = 0 for k in range(0,len(mcp[0])): try: sum1 += (1-mcp[i][k])*proximity[j][k] except: pass sum2 = 0 for k in range(0,len(mcp[0])): try: sum2 += proximity[j][k] except: pass if mcp[i][j] == 1: product_row.append(0) else: product_row.append(sum1/sum2) distance.append(product_row) #compute opportunity gain opportunity_gain = [] for i in range(0,len(mcp)): country_row = [] for j in range(0,len(mcp[0])): gain = 0 for k in range(0,len(mcp[0])): temp = 0 for l in range(0,len(mcp[0])): temp += proximity[l][k] gain += (proximity[j][k]/temp)*(1-mcp[i][k])*pci[k] gain = gain - (1-distance[i][j]) * pci[j] if mcp[i][j] == 1: country_row.append(0) else: country_row.append(gain) opportunity_gain.append(country_row) #compute marginal opportunity gain marginal = [] for i in range(0,len(mcp)): country_row = [] for j in range(0,len(mcp[0])): if mcp[i][j] == 1: country_row.append(0) else: export = raw_matrix[i+1][j+1] country_export = country_sum[i] product_export = product_sum[j] export_increase = (product_export*country_export/total_sum)-export country_row.append(opportunity_gain[i][j]*country_export/export_increase) marginal.append(country_row) #computing sequential strategy country = "Turkey" strategy = [] for i in range(0,len(country_list)): if country_list[i] == country: country_index = i print("Before Iteration: ") for i in range(0,len(marginal[country_index])): print(product_list[i], ": ", marginal[country_index][i]) print(" ") temp = [] temp.append("Before Iteration") posi = {} zero = [] nega = {} for i in range(0,len(marginal[country_index])): if marginal[country_index][i] > 0: posi[product_list[i]] = marginal[country_index][i] elif marginal[country_index][i] == 0: zero.append(product_list[i]) else: nega[product_list[i]] = marginal[country_index][i] posi = rank(posi) nega = rank(nega) temp.extend(posi) temp.append(" ") temp.extend(zero) temp.append(" ") temp.extend(nega) strategy.append(temp) ite_round = 0 prev_industry = [] while max(marginal[country_index]) > 0 and ite_round < 20: ite_round += 1 value = max(marginal[country_index]) for i in range(0,len(marginal[0])): if marginal[country_index][i] == value: industry_index = i industry = product_list[industry_index] prev_industry.append(industry_index) #calculate new export export = raw_matrix[country_index+1][industry_index+1] country_export = country_sum[country_index] product_export = product_sum[industry_index] required_export = product_export*country_export/total_sum export_increase = required_export-export print("increase ", industry, " in ", country, " by ", export_increase, " USD") raw_matrix[country_index+1][industry_index+1] = required_export*1.3 #calculate everything again country_sum = [] for i in range(1,len(raw_matrix)): country_sum.append(np.sum(raw_matrix[i][1::])) product_sum = [] for i in range(1,len(raw_matrix[0])): product = 0 for j in range(1,len(raw_matrix)): product += raw_matrix[j][i] product_sum.append(product) total_sum = np.sum(product_sum) mcp = [] for i in range (1,len(raw_matrix)): country_row = [] for j in range(1,len(raw_matrix[i])): percentage = raw_matrix[i][j]/country_sum[i-1] total_percentage = product_sum[j-1]/total_sum if percentage > total_percentage: country_row.append(1) else: country_row.append(0) mcp.append(country_row) #compute mpp country_sum2 = [] for i in range(0,len(mcp)): country_sum2.append(np.sum(mcp[i])) product_sum2 = [] for i in range(0,len(mcp[0])): product = 0 for j in range(0,len(mcp)): product += mcp[j][i] product_sum2.append(product) mpp = [] for i in range(0,len(mcp[0])): product_row = [] for j in range(0,len(mcp[0])): temp_sum = 0 for k in range(0,len(mcp)): try: temp_sum += (mcp[k][i] * mcp[k][j]/(country_sum2[k]*product_sum2[i])) except: pass product_row.append(temp_sum) mpp.append(product_row) #compute PCI mpp = np.array(mpp) e_vals, e_vecs = LA.eig(mpp) eigenvectors = e_vecs.tolist() eigen = [] for eigenvector in eigenvectors: temp = [] for col in eigenvector: temp.append(col.real) eigen.append(temp) vector = [] for i in range(0,len(eigen)): vector.append(eigen[i][1]) pci = [] if vector[len(vector)-2] > 0: for item in vector: pci.append((item-np.mean(vector))/np.std(vector)) else: for item in vector: pci.append((-item+np.mean(vector))/np.std(vector)) #compute proximity proximity = [] for i in range(0,len(mcp[0])): product_row = [] for j in range(0,len(mcp[0])): temp_sum = 0 for k in range(0,len(mcp)): try: temp_sum += mcp[k][i] * mcp[k][j] except: pass p0 = product_sum2[i] p1 = product_sum2[j] if p0 < p1: large = p1 else: large = p0 product_row.append(temp_sum/large) proximity.append(product_row) #compute actual distance distance = [] for i in range(0,len(mcp)): product_row = [] for j in range(0,len(mcp[0])): sum1 = 0 for k in range(0,len(mcp[0])): try: sum1 += (1-mcp[i][k])*proximity[j][k] except: pass sum2 = 0 for k in range(0,len(mcp[0])): try: sum2 += proximity[j][k] except: pass if mcp[i][j] == 1: product_row.append(0) else: product_row.append(sum1/sum2) distance.append(product_row) #compute opportunity gain opportunity_gain = [] for i in range(0,len(mcp)): country_row = [] for j in range(0,len(mcp[0])): gain = 0 for k in range(0,len(mcp[0])): temp = 0 for l in range(0,len(mcp[0])): temp += proximity[l][k] gain += (proximity[j][k]/temp)*(1-mcp[i][k])*pci[k] gain = gain - (1-distance[i][j]) * pci[j] if mcp[i][j] == 1: country_row.append(0) else: country_row.append(gain) opportunity_gain.append(country_row) #compute marginal opportunity gain marginal = [] for i in range(0,len(mcp)): country_row = [] for j in range(0,len(mcp[0])): if mcp[i][j] == 1: country_row.append(0) else: export = raw_matrix[i+1][j+1] country_export = country_sum[i] product_export = product_sum[j] export_increase = (product_export*country_export/total_sum)-export country_row.append(opportunity_gain[i][j]*country_export/export_increase) marginal.append(country_row) print("Iteration ", ite_round, ": ") for i in range(0,len(marginal[country_index])): print(product_list[i], ": ", marginal[country_index][i]) print(" ") temp = [] string = "Iteration " + str(ite_round) temp.append(string) posi = {} zero = [] nega = {} for i in range(0,len(marginal[country_index])): if marginal[country_index][i] > 0: posi[product_list[i]] = marginal[country_index][i] elif marginal[country_index][i] == 0: zero.append(product_list[i]) else: nega[product_list[i]] = marginal[country_index][i] posi = rank(posi) nega = rank(nega) temp.extend(posi) temp.append(" ") temp.extend(zero) temp.append(" ") temp.extend(nega) strategy.append(temp) strategy = np.array(strategy) strategy = np.transpose(strategy) matrix = open("sequential strategy.csv",'w',newline='') writer = csv.writer(matrix) for i in range(0,len(strategy)): writer.writerow(strategy[i]) matrix.close() if __name__ == "__main__": main()